package com.nlx.notes.module.service;

import com.nlx.notes.module.bean.bo.CategoryMonthStatisticsBo;
import com.nlx.notes.module.bean.bo.FlowMonthAmountStatisticsBO;
import com.nlx.notes.module.bean.bo.TransactionsBO;
import com.nlx.notes.module.bean.dto.FlowPageQueryDTO;
import com.nlx.notes.module.bean.dto.FlowSaveDTO;
import com.nlx.notes.module.bean.dto.TransactionsQueryDTO;
import com.nlx.notes.module.bean.dto.statistics.TopStatisticsDBQueryDTO;
import com.nlx.notes.module.bean.vo.flow.FlowStatisticsSumVO;
import com.nlx.notes.module.entity.Transactions;
import com.baomidou.mybatisplus.extension.service.IService;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author nlx
 * @since 2024-12-15
 */
public interface ITransactionsService extends IService<Transactions> {

    /**
     * 保存流水
     * @param flowSaveDTO 流水参数
     * @return String
     */
    Long saveFlow(FlowSaveDTO flowSaveDTO);

    void initData(Long userId);

    /**
     * 总数查询
     * @param flowPageQueryDTO 条件
     * @return Transactions
     */
    List<Transactions> pageByCondition(FlowPageQueryDTO flowPageQueryDTO);

    long countByCondition(FlowPageQueryDTO flowPageQueryDTO);

    /**
     * 通过条件查询
     * @param transactionsQueryDTO 入参
     * @return Transactions
     */
    Transactions findByCondition(TransactionsQueryDTO transactionsQueryDTO);

    /**
     * 删除流水
     * @param id 流水id
     */
    void removeFlow(Long id);


    /**
     * 通过条件查询总额
     * @param flowPageQueryDTO 参数
     * @return int
     */
    int findIncomeAmountByCondition(FlowPageQueryDTO flowPageQueryDTO);

    /**
     * 通过天统计数据
     * @param flowDate 流水日期
     * @param userId 用户id
     * @return FlowStatisticsSumVO
     */
    FlowStatisticsSumVO sumByDay(LocalDate flowDate, Long userId);

    /**
     * 通过用户id查询月度分类的数据
     * @param userId 用户id
     * @return CategoryMonthStatisticsBo
     */
    List<CategoryMonthStatisticsBo> findCategoryStatistics(String startDate, String endDate, Long userId,Long bookId);

    /**
     * 通过日期查询总数信息
     * @param starDate 开始日期
     * @param endDate 结束日期
     * @param userId 用户
     * @return FlowMonthAmountStatisticsBO
     */
    FlowMonthAmountStatisticsBO sumByDate(String starDate,String endDate, Long userId, Long bookId);


    /**
     * 通过条件查询list
     * @param transactionsQueryDTO 参数
     * @return Transactions
     */
    List<Transactions> findListByCondition(TransactionsQueryDTO transactionsQueryDTO);

    /**
     * 查询交易的top
     * @param topStatisticsDBQueryDTO 参数
     * @return TransactionsBO
     */
    List<TransactionsBO> findTop(TopStatisticsDBQueryDTO topStatisticsDBQueryDTO);
}
